发起一次支付请求时需要创建一个新的 charge
对象,获取一个可用的支付凭据用于客户端向第三方渠道发起支付请求。如果使用测试模式的 API Key,则不会发生真实交易。当支付成功后,Ping++ 会发送 Webhooks 通知。
请求参数 | 描述 |
---|---|
order_no required string | 商户订单号,适配每个渠道对此参数的要求,必须在商户的系统内唯一。(支付宝全渠道: 1-64 位的数字和字母组合; wx : 2-32 位; wx_pub_scan、cb_wx、cb_wx_pub、cb_wx_pub_qr、cb_wx_pub_scan、paypal、coolcredit : 1-32 位的数字和字母组合; bfb : 1-20 位;银联全渠道: 8-40 位的数字和字母组合; yeepay_wap : 1-50 位;jdpay_wap : 1-30 位;qpay :1-30 位;isv_qr、isv_scan、isv_wap : 8-32 位,不重复,建议时间戳+随机数(或交易顺序号);ccb_pay、ccb_qr :1-30 位数字和字母组合;cmpay : 1~50 位的数字和字母组合;cmb_wallet : 6-32 位的数字和字母组合,一天内不能重复,订单日期+订单号唯一定位一笔订单,示例: 20170808test01)。注:推荐使用 8-20 位的数字和字母组合,不允许特殊字符。 |
app[id] expandable required hash | 支付使用的 app 对象的 id ,expandable 可展开,查看如何获取App ID。 |
channel required string | 支付使用的第三方支付渠道。参考 支付渠道属性值。 |
amount required int | 订单总金额(必须大于 0),单位为对应币种的最小货币单位,人民币为分。如订单总金额为 1 元,amount 为 100。 |
client_ip required ip address | 发起支付请求客户端的 IP 地址,支持 IPv4、IPv6 格式。微信H5支付必须上传用户真实 IP 地址,获取方式详见用户 IP 指引) |
currency required string | 3 位 ISO 货币代码,小写字母,人民币为 cny 。使用跨境渠道参考 跨境渠道 currency 说明 ;使用 isv_lite 渠道只支持 cny,hkd 其中的一个值。 |
subject required string | 商品标题,该参数最长为 32 个 Unicode 字符。银联全渠道限制在 32 个字节;支付宝部分渠道不支持特殊字符;cmpay 渠道限制为 1~25 个 Unicode 字符;isv_lite 渠道限制为:1~20 个 unicode 长度,不允许以下特殊字符串"\n\r,,~!@#¥%……&*()【】「」" 。 |
body required string | 商品描述信息,该参数最长为 128 个 Unicode 字符。yeepay_wap 对于该参数长度限制为 100 个 Unicode 字符;支付宝部分渠道不支持特殊字符。 |
extra conditional hash | 特定渠道发起交易时需要的额外参数,以及部分渠道支付成功返回的额外参数,详细参考支付渠道 extra 参数说明。 |
time_expire optional timestamp | 订单失效时间的 Unix 时间戳。时间范围在订单创建后的 1 分钟到 15 天,默认为 1 天,创建时间以 Ping++ 服务器时间为准。微信对该参数的有效值为 2 小时内;upacp、upacp_pc、upacp_wap、cp_b2b、applepay_upacp 渠道对该参数的有效值限制为 1 小时内;upacp_b2b 对该参数的有效值限制为 1 天内;upacp_qr 渠道对该参数的有效期默认为 1 天,最大为 30 天;此参数对 paypal 及 scan 类渠道无效。 |
metadata optional hash | 参考 元数据。 |
description optional string | 订单附加说明,最多 255 个 Unicode 字符。 |
返回
返回一个支付凭据 charge
对象。鉴于支付渠道对 order_no
的合法性要求,为了保证支付请求的正确处理,请务必保证对于同一支付渠道下,不同支付产品间 order_no
的唯一性。例如:已在微信 JSAPI 支付下使用的 order_no
则无法在微信 Native 扫码下重复使用,该规则同样适用于其他同类渠道。如果发生错误,则会返回错误码和错误详情,详见 错误。
POST https://api.pingxx.com/v1/charges
\Pingpp\Charge::create();
Charge.create();
Pingpp::Charge.create();
pingpp.charges.create();
pingpp.Charge.create()
ch,err := charge.New(&ChargeParams)
create(Dictionary<String, Object> param)
curl https://api.pingxx.com/v1/charges \ -u sk_test_ibbTe5jLGCi5rzfH4OqPW9KC: \ -d order_no=123456789 \ -d amount=100 \ -d app[id]=app_1Gqj58ynP0mHeX1q \ -d channel=upacp \ -d currency=cny \ -d client_ip=127.0.0.1 \ -d subject="Your Subject" \ -d body="Your Body"
\Pingpp\Pingpp::setApiKey('sk_test_ibbTe5jLGCi5rzfH4OqPW9KC');
\Pingpp\Charge::create(array(
'order_no' => '123456789',
'amount' => '100',
'app' => array('id' => 'app_1Gqj58ynP0mHeX1q'),
'channel' => 'upacp',
'currency' => 'cny',
'client_ip' => '127.0.0.1',
'subject' => 'Your Subject',
'body' => 'Your Body'
));
Pingpp.apiKey = "sk_test_ibbTe5jLGCi5rzfH4OqPW9KC";
Map<String, Object> chargeParams = new HashMap<String, Object>();
chargeParams.put("order_no", "123456789");
chargeParams.put("amount", 100);
Map<String, String> app = new HashMap<String, String>();
app.put("id", "app_1Gqj58ynP0mHeX1q");
chargeParams.put("app", app);
chargeParams.put("channel", "upacp");
chargeParams.put("currency", "cny");
chargeParams.put("client_ip", "127.0.0.1");
chargeParams.put("subject", "Your Subject");
chargeParams.put("body", "Your Body");
Charge.create(chargeParams);
require "pingpp"
Pingpp.api_key = "sk_test_ibbTe5jLGCi5rzfH4OqPW9KC"
Pingpp::Charge.create(
:subject => "Your Subject",
:body => "Your Body",
:amount => 100,
:order_no => "123456789",
:channel => "upacp",
:currency => "cny",
:client_ip=> '127.0.0.1',
:app => {'id' => "app_1Gqj58ynP0mHeX1q"}
)
var pingpp = require('pingpp')('sk_test_ibbTe5jLGCi5rzfH4OqPW9KC');
pingpp.charges.create({
subject: "Your Subject",
body: "Your Body",
amount: 100,
order_no: "123456789",
channel: "upacp",
currency: "cny",
client_ip: "127.0.0.1",
app: {id: "app_1Gqj58ynP0mHeX1q"}
}, function(err, charge) {
// 异步调用
});
ch = pingpp.Charge.create(
order_no='1234567890',
amount=100,
app=dict(id='app_1Gqj58ynP0mHeX1q'),
channel='upacp',
currency='cny',
client_ip='127.0.0.1',
subject='Your Subject',
body='Your Body',
)
params := &ChargeParams{
Order_no: "123456789",
App: pingpp.App{Id: "app_1Gqj58ynP0mHeX1q"},
Channel: "upacp",
Amount: 100,
Currency: "cny",
Client_ip: "127.0.0.1",
Subject: "Your Subject",
Body: "Your Body",
}
//获得的第一个参数即是 Charge 对象
ch, err := charge.New(params)
Dictionary<String, Object> app = new Dictionary<String, Object>();
app.Add("id", app_1Gqj58ynP0mHeX1q);
Dictionary<String,Object> extra = new Dictionary<String,Object>();
Dictionary<String, Object> params = new Dictionary<String, Object>();
params.Add("amount", 100);
params.Add("currency", "cny");
params.Add("subject", "Your Subject");
params.Add("body", "Your Body");
params.Add("order_no", "123456789");
params.Add("channel", "upacp");
params.Add("client_ip", "127.0.0.1");
params.Add("app", app);
params.Add("extra", extra);
try {
//发起交易请求
Charge ch = Charge.create(params);
Console.WriteLine(ch);
} catch (Exception e) {
Console.WriteLine(e.Message.ToString());
}
{
"id": "ch_L8qn10mLmr1GS8e5OODmHaL4",
"object": "charge",
"created": 1410834527,
"livemode": true,
"paid": false,
"refunded": false,
"reversed": false,
"app": "app_1Gqj58ynP0mHeX1q",
"channel": "upacp",
"order_no": "123456789",
"client_ip": "127.0.0.1",
"amount": 100,
"amount_settle": 100,
"currency": "cny",
"subject": "Your Subject",
"body": "Your Body",
"extra":{},
"time_paid": null,
"time_expire": 1410838127,
"time_settle": null,
"transaction_no": null,
"refunds": {
"object": "list",
"url": "/v1/charges/ch_L8qn10mLmr1GS8e5OODmHaL4/refunds",
"has_more": false,
"data": [ ]
},
"amount_refunded": 0,
"failure_code": null,
"failure_msg": null,
"metadata": {},
"credential": {
"object": "credential",
"upacp": {
"tn": "201409161028470000000",
"mode": "01"
}
},
"description": null
}